Load code
Load data
single lemma
metrics for all lemmas
Filter data
Uses in first subset
df_comp %>%
filter(
SUBSETTING == 'time',
SUBSET == 'one'
) %>%
select(LEMMA, USES_TOT, USES) %>%
arrange(USES)
Case studies
Usage frequency
Overall across cases
df_comp %>%
filter(
LEMMA %in% cases,
SUBSET == 'full'
) %>%
arrange(desc(USES_TOT))
Single lemma
uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)
Degree centralization
Diachronic
plt <- df_comp %>%
select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV) %>%
filter(
SUBSET != 'full',
LEMMA %in% cases
) %>%
ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
guides(group=FALSE) +
ggtitle('Diffusion over time: changes in degree centralization') +
scale_y_continuous('degree centrality') +
scale_x_discrete('subset')
plt

# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)
Overall
df_comp %>%
filter(
LEMMA %in% cases,
SUBSET == 'full'
) %>%
select(
LEMMA,
EDGES,
CENT_DEGREE,
CENT_EV
) %>%
arrange((CENT_DEGREE))
Comparative analyses
Degree centrality
Overall
List
df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE, CENT_EV) %>%
filter(
SUBSET == 'full',
USES >= 2
) %>%
arrange(
# (CENT_DEGREE)
desc(CENT_EV)
)
Plot
plt <- df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
filter(SUBSET == 'full') %>%
arrange((CENT_DEGREE)) %>%
ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
geom_point() +
scale_y_discrete('lemmas') +
scale_x_continuous(
'degree centralization (log)',
trans='log'
)
plt
# ggsave('out/cent_sync_all.pdf', width=6, height=4)
Over time
Across all lemmas
df_comp %>%
filter(
SUBSET %in% c('one', 'two', 'three', 'four'),
# USES >= 1000,
USES_TOT >= 10000
) %>%
group_by(SUBSET) %>%
summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
geom_line() +
geom_point()

Usage intensity
df_comp %>%
filter(SUBSET == 'full') %>%
arrange(desc(USES))
Usage intensity vs. network characteristics
Uses vs. degree centralization
Plot
plt <- df_comp %>%
filter(
SUBSET == 'full'
# USES %in% (10000:2000000),
# USES %in% (150000:500000),
# !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
) %>%
select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
ggplot(., aes(x=CENT_DEGREE, y=USES)) +
geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) +
geom_point() +
scale_y_continuous(
'usage frequency (log)',
trans='log'
) +
scale_x_continuous(
'degree centralization',
# trans='log'
) +
ggtitle(
# 'Usage frequency vs. degree centralization: full sample'
'Usage frequency vs. degree centralization: zooming on case study lexemes'
)
# geom_smooth(method=lm)
ggplotly(plt)
# ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)
Biggest discrepancies
df_comp %>%
filter(
SUBSETTING == 'time',
SUBSET == 'full'
) %>%
select(LEMMA, USES_TOT, SUBSET, USES, CENT_DEGREE) %>%
mutate(DISC = USES_TOT / CENT_DEGREE) %>%
arrange(DISC)
Correlation
df_corr <- df_comp %>%
filter(
# SUBSET != 'full'
# EDGES >= 100
) %>%
select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
cor.test(df_corr$USES, df_corr$CENT_DEGREE)
Pearson's product-moment correlation
data: df_corr$USES and df_corr$CENT_DEGREE
t = -2.5216, df = 544, p-value = 0.01197
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.18968708 -0.02378785
sample estimates:
cor
-0.1074856
Degree centrality vs. communities
Correlation
df_comp %>%
filter(SUBSET == 'last') %>%
select(CENT_DEGREE, COMMUNITIES) %>%
mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
correlate()
Plot
df_comp %>%
filter(SUBSET == 'last') %>%
select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log')
Uses vs. users
Plot
plt <- df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, USES_TOT, USERS_TOT) %>%
ggplot(., aes(x=USERS_TOT, y=USES_TOT)) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log') +
scale_y_continuous(trans='log') +
geom_smooth(method=lm)
ggplotly(plt)
Correlation
df_comp %>%
filter(SUBSET == 'full') %>%
select(USES_TOT, USERS_TOT) %>%
correlate()
Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'
Coefficient of variation
df_comp %>%
filter(
SUBSET == 'full',
USES_TOT >= 1000
) %>%
select(LEMMA, USES_TOT, COEF_VAR) %>%
arrange(desc(COEF_VAR))
Processing status
Lemma list
df_comp %>%
select(LEMMA, SUBSET, STAMP) %>%
filter(SUBSET == 'four') %>%
# mutate(STAMP = as_datetime(STAMP)) %>%
arrange(desc(STAMP))
Dataset statistics
df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
dplyr::summarise(
USES_ALL = sum(USES_TOT),
USERS_ALL = sum(USERS_TOT)
)
COEF_VAR vs. CENT
df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
geom_text(aes(label=LEMMA))

# scale_y_continuous(trans='log')
Correlations: EDA
library(Hmisc)
df_corr <- df_comp %>%
# filter(SUBSET == 'last') %>%
select(-c(LEMMA, SUBSETTING, SUBSET, START, END, SKIP, STAMP)) %>%
select(-c(USERS_TOT, AGE)) %>%
mutate(FOCUS = USES_TOT) %>%
focus(FOCUS) %>%
ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
geom_col() +
coord_flip()
Fehler in UseMethod("focus_") :
nicht anwendbare Methode für 'focus_' auf Objekt der Klasse "c('tbl_df', 'tbl', 'data.frame')" angewendet
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCgojIExvYWQgZGF0YQoKIyMgc2luZ2xlIGxlbW1hCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdBbmdsby1TYXhvbicKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKYGBgCgojIyBtZXRyaWNzIGZvciBhbGwgbGVtbWFzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQppZiAoZXhpc3RzKCdkZl9jb21wJykgPT0gRkFMU0UpIHsKICBkZl9jb21wIDwtIHJlYWRfZGZfY29tcCgpCn0KYGBgCgoKIyBGaWx0ZXIgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPD4lIAogIGZpbHRlcigKICAgIFNLSVAgIT0gVFJVRSwKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnCiAgICAjIHN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UID49IDEwMDAwCiAgICAjIHVuc3VjY2Vzc2Z1bCB3b3JkczogVVNFU19UT1QgPD0gMTAwMDAKICAgICMgd2VpcmQgd29yZHM6IGJpZyBkaWNrIGVuZXJneQogICAgIyBlc3RhYmxpc2hlZCB3b3JkcyBmcm9tIGxpc3QKICAgICkKYGBgCgoKIyMgVXNlcyBpbiBmaXJzdCBzdWJzZXQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdvbmUnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVMpICU+JQogIGFycmFuZ2UoVVNFUykKYGBgCgoKCiMgQ2FzZSBzdHVkaWVzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjYXNlcyA8LSBjKAogICdnaG9zdGluZycsIAogICdsaXR1YXRpb24nLCAKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICd1cGN5Y2xpbmcnLAogICd1cHNraWxsJywKICAnYmFlY2F0aW9uJywKICAnZGFzaGNhbScsCiAgJ292ZXJ0b3VyaXNtJwogICkKYGBgCgoKIyMgQ2hlY2sgdHdlZXRzCgpgYGB7cn0KdHdlZXRzICU+JQogIHNlbGVjdCh0d2VldCwgZGF0ZSkgJT4lCiAgIyBzbGljZSguLCBzYW1wbGUoMTpuKCkpKSAjcmFuZG9tIHNlbGVjdGlvbgogIGFycmFuZ2UoZGF0ZSkgJT4lCiAgVmlldygpCmBgYAoKCiMjIFVzYWdlIGZyZXF1ZW5jeQoKIyMjIE92ZXJhbGwgYWNyb3NzIGNhc2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICAgYXJyYW5nZShkZXNjKFVTRVNfVE9UKSkKYGBgCgoKCiMjIyBTaW5nbGUgbGVtbWEKCmBgYHtyfQp1c2VzIDwtIGdldF91c2VzKHR3ZWV0cykKdXNlc190b3QgPC0gZ2V0X3VzZXNfdG90KHVzZXMpCmFnZSA9IGdldF9hZ2UodXNlcykKY29lZl92YXIgPC0gZ2V0X2NvZWZfdmFyKHVzZXMpCm1lYW5fZGF0ZSA8LSBnZXRfbWVhbl9kYXRlKHVzZXMpCm1heF9kYXRlIDwtIGdldF9tYXhfZGF0ZSh1c2VzKQp1c2VzX21vbnRoIDwtIGNvbnZfdXNlc19tb250aCh1c2VzKQp1c2VzX3BsdCA8LSBwbHRfdXNlcyh1c2VzX21vbnRoLCBsZW1tYSwgbWVhbl9kYXRlLCBtYXhfZGF0ZSkKZ2dwbG90bHkodXNlc19wbHQpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBMRU1NQSAlaW4lIGNhc2VzCiAgKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PUNFTlRfREVHUkVFKSkgKyAjIGdyb3VwPTEKICAgIGdlb21fcG9pbnQoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgc2hhcGU9TEVNTUEpKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgbGluZXR5cGU9TEVNTUEpKSArCiAgICBndWlkZXMoZ3JvdXA9RkFMU0UpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9kZWdfZGlhY19Bbmdsby1TYXhvbi5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXJhbGwKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdCgKICAgIExFTU1BLCAKICAgIEVER0VTLAogICAgQ0VOVF9ERUdSRUUsIAogICAgQ0VOVF9FVgogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpCmBgYAoKCiMgQ29tcGFyYXRpdmUgYW5hbHlzZXMKCgojIyBEZWdyZWUgY2VudHJhbGl0eQoKCiMjIyBPdmVyYWxsCgojIyMjIExpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSwgQ0VOVF9FVikgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVMgPj0gMgogICAgKSAlPiUKICBhcnJhbmdlKAogICAgIyAoQ0VOVF9ERUdSRUUpCiAgICBkZXNjKENFTlRfRVYpCiAgKQpgYGAKCgojIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1yZW9yZGVyKExFTU1BLCBDRU5UX0RFR1JFRSkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9kaXNjcmV0ZSgnbGVtbWFzJykgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfc3luY19hbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyIHRpbWUKCiMjIyMgQWNyb3NzIGFsbCBsZW1tYXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgVVNFU19UT1QgPj0gMTAwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoQ0VOVF9BVkcgPSBtZWFuKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0FWRywgZ3JvdXA9MSkpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoKQpgYGAKCgojIyMjIEJpZ2dlc3QgY2hhbmdlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIENFTlRfREVHUkVFLCBFREdFUywgVVNFU19UT1QpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoCiAgICAgICdvbmUnLCAKICAgICAgJ2ZvdXInCiAgICAgICksCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoQ0VOVF9ESUZGID0gQ0VOVF9ERUdSRUUgLSBsYWcoQ0VOVF9ERUdSRUUsIGRlZmF1bHQ9Q0VOVF9ERUdSRUVbMV0pKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIENFTlRfTEFTVCA9IENFTlRfREVHUkVFLAogICAgRURHRVNfTEFTVCA9IEVER0VTCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfRElGRikpCmBgYAoKCiMgVXNhZ2UgaW50ZW5zaXR5CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQpgYGAKCgoKIyBVc2FnZSBpbnRlbnNpdHkgdnMuIG5ldHdvcmsgY2hhcmFjdGVyaXN0aWNzCgojIyBVc2VzIHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb24KCiMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJwogICAgIyBVU0VTICVpbiUgKDEwMDAwOjIwMDAwMDApLAogICAgIyBVU0VTICVpbiUgKDE1MDAwMDo1MDAwMDApLAogICAgIyAhTEVNTUEgJWluJSBjKCdzbHV0IHNoYW1pbmcnLCAnZGFzaGNhbScsICdzaGFyZWFibGUnLCAnY3Vja29sZCcsICdkZWVwIGxlYXJuaW5nJywgJ2h5cGVybG9jYWwnKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBVU0VTLCBFREdFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICd1c2FnZSBmcmVxdWVuY3kgKGxvZyknLCAKICAgICAgdHJhbnM9J2xvZycKICAgICAgKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24nLAogICAgICAjIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgZ2d0aXRsZSgKICAgICAgIyAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IGZ1bGwgc2FtcGxlJwogICAgICAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IHpvb21pbmcgb24gY2FzZSBzdHVkeSBsZXhlbWVzJwogICAgICApCiAgICAjIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKCmdncGxvdGx5KHBsdCkKIyBnZ3NhdmUoJ34vRGVza3RvcC9mcmVxLXZzLW5ldC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKICAgIApgYGAKCgojIyMgQmlnZ2VzdCBkaXNjcmVwYW5jaWVzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVRUSU5HID09ICd0aW1lJywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgbXV0YXRlKERJU0MgPSBVU0VTX1RPVCAvIENFTlRfREVHUkVFKSAlPiUKICBhcnJhbmdlKERJU0MpCmBgYAoKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvcnIgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICAjIFNVQlNFVCAhPSAnZnVsbCcKICAgICMgRURHRVMgPj0gMTAwCiAgICApICU+JQogIHNlbGVjdCgtYyhMRU1NQSwgU1VCU0VULCBTVEFSVCwgRU5ELCBTS0lQLCBTVEFNUCkpCiAgCmNvci50ZXN0KGRmX2NvcnIkVVNFUywgZGZfY29yciRDRU5UX0RFR1JFRSkKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkgdnMuIGNvbW11bml0aWVzCgojIyMgQ29ycmVsYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoQ0VOVF9ERUdSRUUsIENPTU1VTklUSUVTKSAlPiUKICBtdXRhdGUoQ09NTVVOSVRJRVMgPSBhcy5udW1lcmljKENPTU1VTklUSUVTKSkgJT4lCiAgY29ycmVsYXRlKCkKYGBgCgoKIyMjIFBsb3QKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBDT01NVU5JVElFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PWFzLm51bWVyaWMoQ09NTVVOSVRJRVMpKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAgIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nJykKYGBgCgoKCiMjIFVzZXMgdnMuIHVzZXJzCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBVU0VSU19UT1QpICU+JQogIGdncGxvdCguLCBhZXMoeD1VU0VSU19UT1QsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cnKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKZ2dwbG90bHkocGx0KQpgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChVU0VTX1RPVCwgVVNFUlNfVE9UKSAlPiUKICBjb3JyZWxhdGUoKQpgYGAKCgojIyBDb2VmZmljaWVudCBvZiB2YXJpYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcsCiAgICBVU0VTX1RPVCA+PSAxMDAwCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENPRUZfVkFSKSAlPiUKICBhcnJhbmdlKGRlc2MoQ09FRl9WQVIpKQpgYGAKCgojIyBQcm9jZXNzaW5nIHN0YXR1cwoKIyMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyMgRGF0YXNldCBzdGF0aXN0aWNzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVNfVE9ULCBVU0VSU19UT1QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBVU0VTX0FMTCA9IHN1bShVU0VTX1RPVCksCiAgICBVU0VSU19BTEwgPSBzdW0oVVNFUlNfVE9UKQogICAgKQpgYGAKCgojIENPRUZfVkFSIHZzLiBDRU5UCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBDT0VGX1ZBUiwgQ0VOVF9ERUdSRUUpICU+JQogIGdncGxvdCguLCBhZXMoeT1DT0VGX1ZBUiwgeD1DRU5UX0RFR1JFRSkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpCmBgYAoKCiMgQ29ycmVsYXRpb25zOiBFREEKCmBgYHtyfQpsaWJyYXJ5KEhtaXNjKQoKZGZfY29yciA8LSBkZl9jb21wICU+JQogICMgZmlsdGVyKFNVQlNFVCA9PSAnbGFzdCcpICU+JQogICMgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVRUSU5HLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkgJT4lCiAgIyBzZWxlY3QoLWMoVVNFUlNfVE9ULCBBR0UpKSAlPiUKICAjIG11dGF0ZShGT0NVUyA9IFVTRVNfVE9UKSAlPiUKICAjIGZvY3VzKEZPQ1VTKSAlPiUKICAjIGdncGxvdCguLCBhZXMocmVvcmRlcihyb3duYW1lLCBGT0NVUyksIEZPQ1VTKSkgKwogICMgZ2VvbV9jb2woKSArCiAgIyBjb29yZF9mbGlwKCkKICAjIHJlYXJyYW5nZSgpICU+JQogICMgc2hhdmUoKSAlPiUKICAjIHJwbG90KCkKICAjIG5ldHdvcmtfcGxvdChtaW5fY29yPS41KSAlPiUKCiAgCmBgYAoKCiAg